package PacoteTestes;

import static org.junit.Assert.*;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;


import br.com.loja.produto.Produto;
import br.com.loja.produto.ProdutoRN;

public class ProdutoTeste extends Conexao{
	
	Produto produto;
	ProdutoRN produtoRN;
	List<Produto> listaProdutos;

	public ProdutoTeste(){
		produto = new Produto();
		produtoRN = new ProdutoRN();
		listaProdutos = produtoRN.listar();
	}
	
	@Before
	public void cadastraProduto(){
		
		Produto a = new Produto("Caixa", "Caderno", new Date(), 500, 20.0f);	
		Produto b = new Produto("Caixa", "Regua", new Date(), 250, 2.5f);
		Produto c = new Produto("Fardo", "Papel", new Date(), 300, 4.5f);
		Produto d = new Produto("Caixa", "Livro", new Date(), 100, 30.0f);
		Produto e = new Produto("Caixa", "Caneta", new Date(), 400, 1.5f);
		
		produtoRN.salvar(a);
		produtoRN.salvar(b);
		produtoRN.salvar(c);
		produtoRN.salvar(d);
		produtoRN.salvar(e);
			
	}
	
	@Test
	public void testeListarProdutos(){
		if(listaProdutos == null)
				System.out.println("Lista de produtos nulla!");		
	}
	
	
	@Test
	public void consulta() {
		
		Query consulta = pesquisar("asdf");
		Produto produtoPesquisado = (Produto) consulta.uniqueResult();		
		if(produtoPesquisado.getDescricao().equals(consulta)){
			System.out.println("Achou Regua");
		}
	}
	
	@Test
	public void alteracaoProdutoTest(){
		
		Query consulta = pesquisar("Livro");
		Produto produtoAlterado = (Produto) consulta.uniqueResult();
		
		produtoAlterado.setEstoque(100);
		getSessao().update(produtoAlterado);
		produtoAlterado = (Produto) consulta.uniqueResult();
		assertEquals(100, produtoAlterado.getEstoque().intValue());
		
	}
	
	private Query pesquisar(String parametro) {
		String sql = "from Produto p where p.descricao like :descricao";
		Query consulta = getSessao().createQuery(sql);
		consulta.setString("descricao", "%"+parametro+"%");
		return consulta;
	}
	
	
	public void excluir(){
		int antesDeExcluir = listaProdutos.size();
		Produto excluirProduto = listaProdutos.get(0);
		produtoRN.excluir(excluirProduto);		
		List<Produto> novalista = produtoRN.listar();
		System.out.println("Antes de excluir: "+ antesDeExcluir + " Agora temos:" + novalista.size());
	}
	
	
	
	public Produto produtoVenda(String produto){
		 for (Produto produtoFor : listaProdutos) {
			 if(produtoFor.getDescricao().equalsIgnoreCase(produto)){
				 return produtoFor;
				}
		}
		return null;		
	}

	 
	public void produtoBaixaEstoque(Produto produto, int qtd){	
		 for (Produto produtoFor : listaProdutos) {
			 if(produtoFor.getDescricao().equalsIgnoreCase(produto.getDescricao())){
				 produtoFor.setEstoque(produtoFor.getEstoque() - qtd);
				 produtoRN.salvar(produtoFor);
			 }
		}
	
	}
	
	@SuppressWarnings("unchecked")
	@After
	public void limpaBanco(){
		
		Criteria lista = getSessao().createCriteria(Produto.class);
		List<Produto> produtos = lista.list();
		
		for (Produto p : produtos) {
			produtoRN.excluir(p);
			
		}
		
		if(produto != null)
			System.out.println("Tem produto ativo");
	}
	
}
